﻿package baseEngine.utils
{
    import __AS3__.vec.*;
    import baseEngine.core.*;
    import baseEngine.system.*;
    import flash.geom.*;
    import flash.utils.*;
    import frEngine.core.*;
    import frEngine.shader.filters.*;

    public class Surface3DUtils extends Object
    {
        private static var addNum:int = 0;

        public function Surface3DUtils()
        {
            return;
        }// end function

        public static function buildPolys(param1:FrSurface3D, param2:Matrix3D, param3:Boolean = false) : Vector.<Poly3D>
        {
            var _loc_4:Vector3D = null;
            var _loc_5:Vector3D = null;
            var _loc_6:Vector3D = null;
            var _loc_7:uint = 0;
            var _loc_8:uint = 0;
            var _loc_9:uint = 0;
            var _loc_10:Poly3D = null;
            var _loc_14:int = 0;
            var _loc_18:int = 0;
            if (param1.polys && param3 == false)
            {
                return param1.polys;
            }
            if (!param2)
            {
                param2 = new Matrix3D();
            }
            param1.polys = new Vector.<Poly3D>;
            if (param1.indexBufferFr.numTriangles == -1)
            {
                param1.indexBufferFr.numTriangles = param1.indexVector.length / 3;
            }
            var _loc_11:* = param1.getVertexBufferByNameId(FilterName_ID.POSITION_ID);
            var _loc_12:* = param1.indexVector;
            var _loc_13:* = _loc_11.vertexVector;
            var _loc_15:* = param1.indexVector.length;
            var _loc_16:* = _loc_11.bufferVoMap[FilterName_ID.POSITION_ID].offset;
            var _loc_17:* = _loc_11.bufferVoMap[FilterName_ID.UV_ID].offset;
            var _loc_19:* = _loc_11.sizePerVertex;
            while (_loc_18 < _loc_15)
            {
                
                _loc_7 = _loc_12[_loc_18++] * _loc_19;
                _loc_8 = _loc_12[_loc_18++] * _loc_19;
                _loc_9 = _loc_12[_loc_18++] * _loc_19;
                _loc_4 = new Vector3D(_loc_13[_loc_9 + _loc_16], _loc_13[(_loc_9 + 1) + _loc_16], _loc_13[_loc_9 + 2 + _loc_16]);
                _loc_5 = new Vector3D(_loc_13[_loc_8 + _loc_16], _loc_13[(_loc_8 + 1) + _loc_16], _loc_13[_loc_8 + 2 + _loc_16]);
                _loc_6 = new Vector3D(_loc_13[_loc_7 + _loc_16], _loc_13[(_loc_7 + 1) + _loc_16], _loc_13[_loc_7 + 2 + _loc_16]);
                _loc_4 = param2.transformVector(_loc_4);
                _loc_5 = param2.transformVector(_loc_5);
                _loc_6 = param2.transformVector(_loc_6);
                _loc_10 = new Poly3D(_loc_4, _loc_5, _loc_6);
                if (_loc_17 != -1)
                {
                    _loc_10.uv0 = new Point(_loc_13[_loc_9 + _loc_17], _loc_13[(_loc_9 + 1) + _loc_17]);
                    _loc_10.uv1 = new Point(_loc_13[_loc_8 + _loc_17], _loc_13[(_loc_8 + 1) + _loc_17]);
                    _loc_10.uv2 = new Point(_loc_13[_loc_7 + _loc_17], _loc_13[(_loc_7 + 1) + _loc_17]);
                }
                param1.polys.push(_loc_10);
            }
            param1.updateBoundings();
            return param1.polys;
        }// end function

        public static function buildTangentsAndBitangents(param1:FrSurface3D) : void
        {
            var _loc_2:int = 0;
            var _loc_3:int = 0;
            var _loc_4:int = 0;
            var _loc_5:int = 0;
            var _loc_6:int = 0;
            var _loc_7:int = 0;
            var _loc_8:int = 0;
            var _loc_9:int = 0;
            var _loc_10:int = 0;
            var _loc_11:Number = NaN;
            var _loc_12:Number = NaN;
            var _loc_13:Number = NaN;
            var _loc_14:Number = NaN;
            var _loc_15:Number = NaN;
            var _loc_16:Number = NaN;
            var _loc_17:Number = NaN;
            var _loc_18:Number = NaN;
            var _loc_19:Number = NaN;
            var _loc_20:Number = NaN;
            var _loc_21:Number = NaN;
            var _loc_22:int = 0;
            var _loc_23:int = 0;
            var _loc_42:int = 0;
            var _loc_45:int = 0;
            var _loc_51:int = 0;
            var _loc_24:* = param1.bufferVoMap;
            if (_loc_24[FilterName_ID.TANGENT_ID].offset != -1 || _loc_24[FilterName_ID.BITANGENT_ID].offset != -1)
            {
                return;
            }
            var _loc_25:* = param1.getVertexBufferByNameId(FilterName_ID.TANGENT_ID).vertexVector;
            var _loc_26:* = param1.indexVector;
            var _loc_27:* = param1.sizePerVertex;
            var _loc_28:* = new Vector.<Number>(_loc_25.length / _loc_27 * 3);
            var _loc_29:* = new Vector.<Number>(_loc_25.length / _loc_27 * 3);
            var _loc_30:* = new Vector3D();
            var _loc_31:* = new Vector3D();
            var _loc_32:* = new Vector3D();
            var _loc_33:* = new Vector3D();
            var _loc_34:* = new Vector3D();
            var _loc_35:* = new Point();
            var _loc_36:* = new Point();
            var _loc_37:* = new Point();
            var _loc_38:* = _loc_24[FilterName_ID.POSITION_ID].offset;
            var _loc_39:* = _loc_24[FilterName_ID.UV_ID].offset;
            var _loc_40:* = _loc_24[FilterName_ID.NORMAL_ID].offset;
            var _loc_41:* = _loc_26.length;
            while (_loc_42 < _loc_41)
            {
                
                _loc_2 = _loc_26[_loc_42];
                _loc_3 = _loc_26[(_loc_42 + 1)];
                _loc_4 = _loc_26[_loc_42 + 2];
                _loc_5 = _loc_2 * _loc_27 + _loc_38;
                _loc_6 = _loc_3 * _loc_27 + _loc_38;
                _loc_7 = _loc_4 * _loc_27 + _loc_38;
                _loc_8 = _loc_2 * _loc_27 + _loc_39;
                _loc_9 = _loc_3 * _loc_27 + _loc_39;
                _loc_10 = _loc_4 * _loc_27 + _loc_39;
                _loc_30.setTo(_loc_25[_loc_5], _loc_25[(_loc_5 + 1)], _loc_25[_loc_5 + 2]);
                _loc_31.setTo(_loc_25[_loc_6], _loc_25[(_loc_6 + 1)], _loc_25[_loc_6 + 2]);
                _loc_32.setTo(_loc_25[_loc_7], _loc_25[(_loc_7 + 1)], _loc_25[_loc_7 + 2]);
                _loc_11 = _loc_31.x - _loc_30.x;
                _loc_12 = _loc_32.x - _loc_30.x;
                _loc_13 = _loc_31.y - _loc_30.y;
                _loc_14 = _loc_32.y - _loc_30.y;
                _loc_15 = _loc_31.z - _loc_30.z;
                _loc_16 = _loc_32.z - _loc_30.z;
                _loc_35.setTo(_loc_25[_loc_8], -_loc_25[(_loc_8 + 1)]);
                _loc_36.setTo(_loc_25[_loc_9], -_loc_25[(_loc_9 + 1)]);
                _loc_37.setTo(_loc_25[_loc_10], -_loc_25[(_loc_10 + 1)]);
                _loc_17 = _loc_36.x - _loc_35.x;
                _loc_18 = _loc_37.x - _loc_35.x;
                _loc_19 = _loc_36.y - _loc_35.y;
                _loc_20 = _loc_37.y - _loc_35.y;
                _loc_21 = 1 / (_loc_17 * _loc_20 - _loc_18 * _loc_19);
                _loc_33.setTo((_loc_20 * _loc_11 - _loc_19 * _loc_12) * _loc_21, (_loc_20 * _loc_13 - _loc_19 * _loc_14) * _loc_21, (_loc_20 * _loc_15 - _loc_19 * _loc_16) * _loc_21);
                _loc_34.setTo((_loc_17 * _loc_12 - _loc_18 * _loc_11) * _loc_21, (_loc_17 * _loc_14 - _loc_18 * _loc_13) * _loc_21, (_loc_17 * _loc_16 - _loc_18 * _loc_15) * _loc_21);
                _loc_28[_loc_2 * 3] = _loc_28[_loc_2 * 3] + _loc_33.x;
                _loc_28[_loc_2 * 3 + 1] = _loc_28[_loc_2 * 3 + 1] + _loc_33.y;
                _loc_28[_loc_2 * 3 + 2] = _loc_28[_loc_2 * 3 + 2] + _loc_33.z;
                _loc_28[_loc_3 * 3] = _loc_28[_loc_3 * 3] + _loc_33.x;
                _loc_28[_loc_3 * 3 + 1] = _loc_28[_loc_3 * 3 + 1] + _loc_33.y;
                _loc_28[_loc_3 * 3 + 2] = _loc_28[_loc_3 * 3 + 2] + _loc_33.z;
                _loc_28[_loc_4 * 3] = _loc_28[_loc_4 * 3] + _loc_33.x;
                _loc_28[_loc_4 * 3 + 1] = _loc_28[_loc_4 * 3 + 1] + _loc_33.y;
                _loc_28[_loc_4 * 3 + 2] = _loc_28[_loc_4 * 3 + 2] + _loc_33.z;
                _loc_29[_loc_2 * 3] = _loc_29[_loc_2 * 3] + _loc_34.x;
                _loc_29[_loc_2 * 3 + 1] = _loc_29[_loc_2 * 3 + 1] + _loc_34.y;
                _loc_29[_loc_2 * 3 + 2] = _loc_29[_loc_2 * 3 + 2] + _loc_34.z;
                _loc_29[_loc_3 * 3] = _loc_29[_loc_3 * 3] + _loc_34.x;
                _loc_29[_loc_3 * 3 + 1] = _loc_29[_loc_3 * 3 + 1] + _loc_34.y;
                _loc_29[_loc_3 * 3 + 2] = _loc_29[_loc_3 * 3 + 2] + _loc_34.z;
                _loc_29[_loc_4 * 3] = _loc_29[_loc_4 * 3] + _loc_34.x;
                _loc_29[_loc_4 * 3 + 1] = _loc_29[_loc_4 * 3 + 1] + _loc_34.y;
                _loc_29[_loc_4 * 3 + 2] = _loc_29[_loc_4 * 3 + 2] + _loc_34.z;
                _loc_42 = _loc_42 + 3;
            }
            var _loc_43:* = new FrSurface3D("tangents/bitangents");
            var _loc_44:* = _loc_43.getVertexBufferByNameId(FilterName_ID.TANGENT_ID).vertexVector;
            var _loc_46:int = 3;
            var _loc_47:* = new Vector3D();
            var _loc_48:* = new Vector3D();
            var _loc_49:* = new Vector3D();
            var _loc_50:* = new Vector3D();
            var _loc_52:* = _loc_25.length / _loc_27;
            _loc_42 = _loc_51;
            while (_loc_42 < _loc_52)
            {
                
                _loc_22 = _loc_42 * _loc_27;
                _loc_23 = _loc_42 * 6;
                _loc_47.setTo(_loc_25[_loc_22 + _loc_40], _loc_25[_loc_22 + _loc_40 + 1], _loc_25[_loc_22 + _loc_40 + 2]);
                _loc_48.setTo(_loc_44[_loc_23 + _loc_45], _loc_44[_loc_23 + _loc_45 + 1], _loc_44[_loc_23 + _loc_45 + 2]);
                _loc_49.setTo(_loc_44[_loc_23 + _loc_46], _loc_44[_loc_23 + _loc_46 + 1], _loc_44[_loc_23 + _loc_46 + 2]);
                _loc_50.copyFrom(_loc_47);
                _loc_50.scaleBy(_loc_47.dotProduct(_loc_48));
                _loc_48 = _loc_48.subtract(_loc_50);
                _loc_48.normalize();
                _loc_50.copyFrom(_loc_47);
                _loc_50.scaleBy(_loc_47.dotProduct(_loc_49));
                _loc_49 = _loc_49.subtract(_loc_50);
                _loc_49.normalize();
                _loc_44[_loc_42 * 6 + _loc_45] = _loc_48.x;
                _loc_44[_loc_42 * 6 + _loc_45 + 1] = _loc_48.y;
                _loc_44[_loc_42 * 6 + _loc_45 + 2] = _loc_48.z;
                _loc_44[_loc_42 * 6 + _loc_46] = _loc_49.x;
                _loc_44[_loc_42 * 6 + _loc_46 + 1] = _loc_49.y;
                _loc_44[_loc_42 * 6 + _loc_46 + 2] = _loc_49.z;
                _loc_42++;
            }
            return;
        }// end function

        private static function addVertex(param1:int, param2:int, param3:Dictionary) : void
        {
            var _loc_4:Object = null;
            var _loc_5:int = 0;
            var _loc_6:int = 0;
            var _loc_7:Vector.<Number> = null;
            var _loc_9:* = addNum + 1;
            addNum = _loc_9;
            for (_loc_4 in param3)
            {
                
                _loc_5 = 0;
                _loc_6 = _loc_4.sizePerVertex;
                _loc_7 = _loc_4.vertexVector;
                if (_loc_7.length < (param2 + 1) * _loc_6)
                {
                    _loc_7.length = (param2 + 1) * _loc_6;
                }
                while (_loc_5 < _loc_6)
                {
                    
                    _loc_7[param2 * _loc_6 + _loc_5] = _loc_7[param1 * _loc_6 + _loc_5];
                    _loc_5++;
                }
            }
            return;
        }// end function

        public static function split(param1:FrSurface3D) : SplitSurfaceInfo
        {
            var _loc_2:Dictionary = null;
            var _loc_3:Array = null;
            var _loc_4:int = 0;
            var _loc_5:int = 0;
            var _loc_6:uint = 0;
            var _loc_7:uint = 0;
            var _loc_8:uint = 0;
            var _loc_9:int = 0;
            var _loc_10:int = 0;
            var _loc_11:int = 0;
            var _loc_12:int = 0;
            var _loc_25:uint = 0;
            var _loc_26:uint = 0;
            var _loc_27:uint = 0;
            var _loc_32:int = 0;
            var _loc_33:int = 0;
            var _loc_34:int = 0;
            addNum = 0;
            var _loc_13:* = new SplitSurfaceInfo();
            var _loc_14:* = _loc_13.skinData;
            var _loc_15:* = _loc_13.startIndex;
            var _loc_16:* = _loc_13.triangleNum;
            var _loc_17:* = Device3D.maxBonesPerSurface;
            var _loc_18:* = param1.getVertexBufferByNameId(FilterName_ID.SKIN_INDICES_ID);
            _loc_2 = new Dictionary();
            _loc_3 = [];
            if (param1.indexBufferFr.numTriangles == -1)
            {
                param1.indexBufferFr.numTriangles = param1.indexVector.length / 3;
            }
            var _loc_19:int = 0;
            _loc_4 = param1.firstIndex;
            _loc_5 = _loc_4 + param1.indexBufferFr.numTriangles * 3;
            var _loc_20:* = _loc_18.vertexVector;
            var _loc_21:* = new Vector.<Number>(_loc_20.length);
            var _loc_22:* = param1.indexVector;
            var _loc_23:* = _loc_18.sizePerVertex;
            var _loc_24:* = _loc_20.length / _loc_23;
            var _loc_28:int = 1;
            var _loc_29:* = int(_loc_24 * 3);
            var _loc_30:* = new Vector.<uint>(_loc_29);
            var _loc_31:* = new Vector.<uint>(_loc_29);
            var _loc_35:* = param1.getUseSameBufferVoList();
            while (_loc_4 < _loc_5)
            {
                
                _loc_6 = _loc_22[_loc_4++];
                _loc_7 = _loc_22[_loc_4++];
                _loc_8 = _loc_22[_loc_4++];
                if (_loc_30[_loc_6] == 0)
                {
                    _loc_30[_loc_6] = _loc_28;
                    var _loc_36:* = _loc_6;
                    _loc_31[_loc_6] = _loc_6;
                    _loc_32 = _loc_36;
                }
                else if (_loc_30[_loc_6] != _loc_28)
                {
                    addVertex(_loc_6, _loc_24, _loc_35);
                    var _loc_36:* = _loc_24;
                    _loc_32 = _loc_24;
                    var _loc_36:* = _loc_36;
                    _loc_31[_loc_6] = _loc_36;
                    _loc_22[_loc_4 - 3] = _loc_36;
                    _loc_30[_loc_6] = _loc_28;
                    _loc_21.length = _loc_21.length + _loc_23;
                    _loc_24++;
                }
                else
                {
                    _loc_32 = _loc_31[_loc_6];
                    _loc_22[_loc_4 - 3] = _loc_32;
                }
                if (_loc_30[_loc_7] == 0)
                {
                    _loc_30[_loc_7] = _loc_28;
                    var _loc_36:* = _loc_7;
                    _loc_31[_loc_7] = _loc_7;
                    _loc_33 = _loc_36;
                }
                else if (_loc_30[_loc_7] != _loc_28)
                {
                    addVertex(_loc_7, _loc_24, _loc_35);
                    var _loc_36:* = _loc_24;
                    _loc_33 = _loc_24;
                    var _loc_36:* = _loc_36;
                    _loc_31[_loc_7] = _loc_36;
                    _loc_22[_loc_4 - 2] = _loc_36;
                    _loc_30[_loc_7] = _loc_28;
                    _loc_21.length = _loc_21.length + _loc_23;
                    _loc_24++;
                }
                else
                {
                    _loc_33 = _loc_31[_loc_7];
                    _loc_22[_loc_4 - 2] = _loc_33;
                }
                if (_loc_30[_loc_8] == 0)
                {
                    _loc_30[_loc_8] = _loc_28;
                    var _loc_36:* = _loc_8;
                    _loc_31[_loc_8] = _loc_8;
                    _loc_34 = _loc_36;
                }
                else if (_loc_30[_loc_8] != _loc_28)
                {
                    addVertex(_loc_8, _loc_24, _loc_35);
                    var _loc_36:* = _loc_24;
                    _loc_34 = _loc_24;
                    var _loc_36:* = _loc_36;
                    _loc_31[_loc_8] = _loc_36;
                    _loc_22[(_loc_4 - 1)] = _loc_36;
                    _loc_30[_loc_8] = _loc_28;
                    _loc_21.length = _loc_21.length + _loc_23;
                    _loc_24++;
                }
                else
                {
                    _loc_34 = _loc_31[_loc_8];
                    _loc_22[(_loc_4 - 1)] = _loc_34;
                }
                _loc_9 = 0;
                while (_loc_9 < _loc_23)
                {
                    
                    _loc_25 = _loc_6 * _loc_23 + _loc_9;
                    _loc_26 = _loc_7 * _loc_23 + _loc_9;
                    _loc_27 = _loc_8 * _loc_23 + _loc_9;
                    _loc_10 = _loc_20[_loc_25];
                    _loc_11 = _loc_20[_loc_26];
                    _loc_12 = _loc_20[_loc_27];
                    if (_loc_2[_loc_10] == null)
                    {
                        _loc_2[_loc_10] = _loc_3.length * 3;
                        _loc_3.push(_loc_10 / 3);
                    }
                    if (_loc_2[_loc_11] == null)
                    {
                        _loc_2[_loc_11] = _loc_3.length * 3;
                        _loc_3.push(_loc_11 / 3);
                    }
                    if (_loc_2[_loc_12] == null)
                    {
                        _loc_2[_loc_12] = _loc_3.length * 3;
                        _loc_3.push(_loc_12 / 3);
                    }
                    _loc_21[_loc_32 * _loc_23 + _loc_9] = _loc_2[_loc_10];
                    _loc_21[_loc_33 * _loc_23 + _loc_9] = _loc_2[_loc_11];
                    _loc_21[_loc_34 * _loc_23 + _loc_9] = _loc_2[_loc_12];
                    _loc_9++;
                }
                if (_loc_3.length > _loc_17 || _loc_4 == _loc_5)
                {
                    if (_loc_3.length > _loc_17)
                    {
                        _loc_4 = _loc_4 - 3;
                        _loc_3.length = _loc_17;
                    }
                    if (_loc_3.length > 0)
                    {
                        _loc_14.push(Surface3DUtils.Vector.<int>(_loc_3));
                        _loc_15.push(_loc_19);
                        _loc_16.push((_loc_4 - _loc_19) / 3);
                        _loc_28++;
                    }
                    _loc_2 = new Dictionary(false);
                    _loc_3 = [];
                    _loc_19 = _loc_4;
                }
            }
            _loc_18.vertexVector = _loc_21;
            trace("顶点数：" + (_loc_24 - addNum), "新增顶点数：" + addNum, "surfaceNum:" + _loc_14.length);
            return _loc_13;
        }// end function

    }
}
